#include<iostream>
using namespace std;
/*
深浅拷贝是面试经典问题，也是常见的一个坑
浅拷贝：简单的赋值拷贝操作
深拷贝：在堆区重新申请空间，进行拷贝操作

总结：如果属性有在堆区开辟的，一定要自己提供拷贝构造函数，防止浅拷贝带来的问题
*/
class Person
{
public:
    Person()
    {
        cout<<"Person的构造函数调用"<<endl;
    }
    Person(int age,int height)
    {
        m_Age=age;
        m_Height=new int(height);
        cout<<"Person的有参构造函数调用"<<endl;
    }
    Person(const Person &p)
    {
        m_Age=p.m_Age;
        // m_Height=p.m_Height;//浅拷贝带来的问题就是堆区的内存重复释放
        m_Height=new int(*p.m_Height);
        cout<<"Person的拷贝构造函数调用"<<endl;
    }
    ~Person()
    {
        //析构代码，将堆区开辟数据做释放操作
        if(m_Height!=NULL)
        {
            delete m_Height;
            m_Height=NULL;
        }
        cout<<"Person的析构函数调用"<<endl;
    }
    int m_Age;
    int *m_Height;
};
void test01()
{
    Person p(10,160);
    Person p1(p);//如果没有重写拷贝构造函数的深拷贝，那么进入析构函数后，无参和拷贝会两次释放堆区，造成错误，所以需要重写拷贝函数，进行深拷贝，就是开辟一个新的堆区
}
int main()
{
    test01();
}